package com.gykfbxxh.imovie.base;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.TextView;

import com.app.utils.swipemenulistview.SwipeMenuListView;
import com.gykfbxxh.imovie.R;
import com.gykfbxxh.imovie.custom.view.LoadView;

import java.util.List;

/**
 * 通用的展示list数据的activity 侧滑删除功能
 *
 * @author xuxinghai
 */
public abstract class BaseSwipeMenuListActivity<T> extends BaseActivity implements
//		, OnRefreshListener2<ListView>
        View.OnClickListener, AdapterView.OnItemClickListener, AbsListView.OnScrollListener {

    public final int NO_NET = 0;// 网络错误
    public final int DATAERROR = 1;// 数据错误
    public final int LOADING = 2;// 数据加载中
    public final int LOADSUCES = 3;// 加载成功
    public final int DATAEMPTY = 4;// 数据为空

    // 数据变量
    protected List<T> dataList;// 数据对象集合
    protected AppBaseAdapter<T> mAdapter;// 数据适配器

    // 控件变量
    protected SwipeMenuListView mSwipeMenuListView;
    protected LoadView mLoadView;// 加载数据等待提示控件
    protected TextView notify_view_text;// 蓝色通知栏内的文字
    private View mfooterview;//底部显示加载更多

    // 逻辑变量
    protected int mDataPage = 1;// 请求的数据页数
    boolean isLastRow = false;//是否显示最后一行
    protected String mFootViewStr = "点击或上拉加载更多";//默认底部显示的文字


    /**************************
     * Activity必要的重写的方法 start
     **************************/
    @Override
    public void onCreate(Bundle savedInstanceState) {
        isSlideBack = false;
        super.onCreate(savedInstanceState);
//        ViewGroup decor = (ViewGroup) getWindow().getDecorView();//根布局
//        ViewGroup decorChild = (ViewGroup) decor.getChildAt(0);//可滑动view
//        View contentview = decorChild.getChildAt(0);//原来的view
//        decor.removeView(decorChild);//移除可滑动的布局
//        decorChild.removeView(contentview);//可滑动布局移除原有的view
//        decor.addView(contentview);//根布局添加原有的view
        addContentView(R.layout.activity_base_swipemenulist);

        // 初始化页面控件以及数据
        initView();
        //子类根据自己的需要改变页面控件
        changeView();
        // 初始化数据
        changeData(true);
    }


    /**
     * 初始化页面控件以及该显示的数据
     */
    private void initView() {

        mSwipeMenuListView = (SwipeMenuListView) findViewById(R.id.swipeMenuListView);
        mLoadView = (LoadView) findViewById(R.id.ld_loadview);
        // Toast提示框
        notify_view_text = (TextView) findViewById(R.id.tv_notify);
        mLoadView.setErrorPageClickListener(this);
        //  mLoadView.setEmptyPageClickListener(this);
        mfooterview = getLayoutInflater().inflate(R.layout.layout_swipemenu_footer, null);
        mfooterview.setOnClickListener(this);
        mSwipeMenuListView.addFooterView(mfooterview);
        mSwipeMenuListView.setEmptyView(mLoadView);
        mSwipeMenuListView.setOnItemClickListener(this);
        mSwipeMenuListView.setOnScrollListener(this);
        //配置listview可左右滑动
        configSwiperMenuListView();

    }

    /**
     * 改变页面控件
     */
    protected void changeView() {
    }

    /**
     * 配置listview的左右滑动以及实现的功能,具体功能由子类实现
     */
    protected abstract void configSwiperMenuListView();

    /************************** Activity所有重写的方法 end **************************/

    /*************************** 所有操作数据的方法 start ***************/


    /**
     * 改变listview显示的数据
     *
     * @param isRefresh 是否刷新
     */
    protected abstract void changeData(final boolean isRefresh);


    /**
     * 重载的Loadview EmptyView的方法
     * @param code DATAEMPTY
     * @param resId 对应的图片
     * @param msg   暂时最多传两个String，第一个对应小字体，第二个对应加粗字体
     */
    protected  void setLoadView(int code,int resId,String... msg){
        switch(code){
            case DATAEMPTY:
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showEmptyPage(resId,msg);
                }
                break;
        }

    }

    /**
     * LoadViewd 方法
     * @param code 传入对应的值
     * @param msg  提示的的文字
     *
     *
     */
    protected void setLoadView(int code, String msg) {
        switch (code) {
            case NO_NET://网络错误
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showErrorPage(msg);
                } else {
                    setFootView(false, msg);
                }
                break;
            case DATAERROR://数据错误
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showErrorPage(msg);
                }else if(mfooterview != null){
                    //改变底部显示的文字
//                    configFootView(msg,false);
                    setFootView(false,msg);
                }
                break;
            case LOADING://加载中
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showLoadPage(msg);
                }
//                configFootView(msg,true)
                setFootView(true,msg);
                break;
            case LOADSUCES://加载成功
                if (dataList == null || dataList.size() == 0) {
                    mLoadView.showSuccess();
                }else{
                    setFootView(false,msg);
                }

                break;


        }
    }


    protected void setFootView(boolean isLoading, String msg) {
        if (dataList != null
                && dataList.size() < 10
                && mSwipeMenuListView != null
                && TextUtils.isEmpty(msg)) {
            //改变底部显示的文字
            TextView loadText = (TextView) mfooterview.findViewById(R.id.loading_text);
            if (loadText != null) {
                loadText.setText(mFootViewStr);
            }
            View loadImg = mfooterview.findViewById(R.id.loading_progress);
            if (loadImg != null && !isLoading) {
                loadImg.setVisibility(View.GONE);
            }
        } else if (!TextUtils.isEmpty(msg)) {
            //改变底部显示的文字
            TextView loadText = (TextView) mfooterview.findViewById(R.id.loading_text);
            if (loadText != null) {
                loadText.setText(msg);
            }
            View loadImg = mfooterview.findViewById(R.id.loading_progress);
            if (loadImg != null && !isLoading) {
                loadImg.setVisibility(View.GONE);
            } else if (loadImg != null && isLoading) {
                loadImg.setVisibility(View.VISIBLE);
            }
        }
    }




    /*************************** 所有操作数据的方法 end ***************/

    /************************
     * 所有的事件 start
     *************************/

    // 所有单机事件
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.error_page:// 重新加载页面数据
                mDataPage = 1;
                changeData(true);
                break;
           /* case R.id.textView_apptitle:// 标题点击事件
                toScrollTop();
                break;*/
            case R.id.footerview://加载更多
                onLoadMore();
                break;
            default:

                break;
        }
    }


    // 需要重写的 listview的item的单击事件
    @Override
    public abstract void onItemClick(AdapterView<?> parent, View view,
                                     int position, long id);


    /**
     * 当滚动状态发生改变时
     *
     * @param view
     * @param scrollState
     */
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        //正在滚动时回调，回调2-3次，手指没抛则回调2次。scrollState = 2的这次不回调
        //回调顺序如下
        //第1次：scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
        //第2次：scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作（手指离开屏幕前，用力滑了一下）
        //第3次：scrollState = SCROLL_STATE_IDLE(0) 停止滚动
        //当屏幕停止滚动时为0；当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1；
        //由于用户的操作，屏幕产生惯性滑动时为2

        //当滚到最后一行且停止滚动时，执行加载
        if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
            //加载元素
            isLastRow = false;
            onLoadMore();
        }

    }

    /**
     * 当处于滚动状态时
     *
     * @param view
     * @param firstVisibleItem
     * @param visibleItemCount
     * @param totalItemCount
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //滚动时一直回调，直到停止滚动时才停止回调。单击时回调一次。
        //firstVisibleItem：当前能看见的第一个列表项ID（从0开始）
        //visibleItemCount：当前能看见的列表项个数（小半个也算）
        //totalItemCount：列表项共数

        //判断是否滚到最后一行
        if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
            isLastRow = true;
        } else {
            isLastRow = false;
        }
    }

    /**
     * 加载更多
     */
    protected void onLoadMore() {
        mDataPage++;

        changeData(false);
    }

    /**
     * 回到顶部
     */
    protected void toScrollTop() {
        if (mSwipeMenuListView == null) {
            return;
        }
        mSwipeMenuListView.setSelection(0);
    }


    /**
     * 设置空数据时按钮显示的文字
     *
     * @param text
     */
    protected void setEmptyBtnText(String text) {
        if (mLoadView != null) {
            mLoadView.showErrorPage(text);
        }
    }

    /************************ 所有的事件 end *************************/

}